<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // has()捕获器会在 in 操作符中被调用。对应的反射 API 方法为 Reflect.has()。
    const myTarget = {};
    const proxy = new Proxy(myTarget, {
        has(target, property) {
            console.log('has()');
            return Reflect.has(...arguments) }
    });
    'foo' in proxy;
    // has()
  /* 
    1. 返回值 has()必须返回布尔值，表示属性是否存在。返回非布尔值会被转型为布尔值。
    2. 拦截的操作
         property in proxy
         property in Object.create(proxy)  with(proxy) {(property);}
         Reflect.has(proxy, property)
    3. 捕获器处理程序参数
         target:目标对象。
         property:引用的目标对象上的字符串键属性。
    4. 捕获器不变式
         如果 target.property 存在且不可配置，则处理程序必须返回 true。
         如果 target.property 存在且目标对象不可扩展，则处理程序必须返回 true。*/
</script>
</body>
</html>